/*
 * ReferenciaPatronBase.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 6/03/2011, 12:18:29 PM
 */

package com.ufps.cuatro.util.base;

import com.ufps.cuatro.controlador.render.UtilRender;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.util.generadores.GeneradorComponentes;

/**
 * <i><b>ReferenciaPatronBase:</b></i>:<p>Esta Clase define una Representación en el Patron
 * actual utilizado. Asocia un Tipo de Dato Soportado con un Componente Base, Contenedor Base ó
 * Componente Personalizado.</p>
 * <p>Una Referencia es la forma en la cual el Patron representa una Tipo de Dato
 * y esa configuracion debe ser previamente incluida en su respectivo archivo Properties.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 6/03/2011
 * @see ObjectBase
 */
public class ReferenciaPatronBase extends ObjectBase{
    private static final long serialVersionUID = -4680949193326530904L;
    
    private int type;
    private int component;        
    private int custom; 
    private PatronRepresentacionBase objParent;       

    /** Constructor por Defecto. 
     *  Crea un nuevo objeto ReferenciaPatronBase 
     */
    public ReferenciaPatronBase() {        
        super();
    }    

    /**
     * Constructor utilizado en la Implementación.
     * @param id Indice de Identificación del Objeto.
     * @param type Tipo de Dato Base .
     * @param component Componente.
     * @param custom Indica si es Base o Personalizado.
     */
    public ReferenciaPatronBase(int id, int type, int component, int custom) {
        super(id);
        this.type = type;
        this.component = component;        
        this.custom = custom;
    }

    /**
     * Constructor utilizado en la Implementación.
     * @param id Indice de Identificación del Objeto.
     * @param type Tipo de Dato Base .
     * @param component Componente Base.
     * @param custom Indica si es Base o Personalizado.
     * @param objParent Patron de Representaciones Padre.
     */
    public ReferenciaPatronBase(int id, int type, int component, int custom, PatronRepresentacionBase objParent) {
        super(id);
        this.type = type;
        this.component = component;        
        this.custom = custom;
        this.objParent = objParent;
    }            

    /**
     * Devuelve el Patrón de Representación Asociado.
     * @return Patrón de Representación Asociado.
     */
    public PatronRepresentacionBase getObjParent() {
        return objParent;
    }

    /**
     * Establece el Patrón de Representación Asociado.
     * @param objParent Patrón de Representación Asociado.
     */
    public void setObjParent(PatronRepresentacionBase objParent) {
        this.objParent = objParent;
    }

    /**
     * Devuelve el Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     * @return Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     */
    public int getComponent() {
        return component;
    }

    /**
     * Establece el Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     * @param component Id de Generación del Componente Generador Asociado para Operaciones de Entrada.
     */
    public void setComponent(int component) {
        this.component = component;
    }

    /**
     * Devuelve el valor que indica si el componente es base o personalizado.
     * @return valor que indica si el componente es base o personalizado.
     */
    public int getCustom() {
        return custom;
    }

    /**
     * Establece el valor que indica si el componente es base o personalizado.
     * @param custom valor que indica si el componente es base o personalizado.
     */
    public void setCustom(int custom) {
        this.custom = custom;
    }    

    /**
     * Devuelve el Id de Generación del Tipo de Dato Soportado asociado al la Referencia.
     * @return Id de Generación del Tipo de Dato Soportado asociado al la Referencia.
     */
    public int getType() {
        return type;
    }

    /**
     * Establece el Id de Generación del Tipo de Dato Soportado asociado al la Referencia.
     * @param type Id de Generación del Tipo de Dato Soportado asociado al la Referencia.
     */
    public void setType(int type) {
        this.type = type;
    }
    
    
    
    @Override
    public int compareTo(Object o) {
       try{
            ReferenciaPatronBase obj = (ReferenciaPatronBase) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
    return 0;
    }

    @Override
    public String toString() {
       try{
            return objParent.getNombre() + " Ref: " + id;
        }catch(java.lang.NullPointerException ex){}
       return "";
    }    
    
    /**
     * Devuelve el Tipo de Dato Asociado a la Representacion.
     * @return Tipo de Dato Asociado a la Representacion.
     */
    public TipoDatoRepresentacionBase getTipoDato(){
        try{
            if(GeneradorComponentes.objTiposDatoRepresentacionBase != null){
            return GeneradorComponentes.objTiposDatoRepresentacionBase.get(this.type);
            }
        }catch(java.lang.ArrayIndexOutOfBoundsException ex){   
            Logger.getLogger(ReferenciaPatronBase.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Devuelve el Componente Base para la Representación de la Referencia
     * de acuerdo al modo de operacion y tipo de compatibilidad.
     * @return Componente Base
     */
    public ComponenteBase getRepresentacion(){
       try{
           if(GeneradorComponentes.objTiposDatoRepresentacionBase != null){
                TipoDatoRepresentacionBase objTipoDatoBase =
                        GeneradorComponentes.objTiposDatoRepresentacionBase.get(this.type);

                if(objTipoDatoBase.getCompatibilidad() == 0){
                    return GeneradorComponentes.objComponentesBase.get(this.component);
                }
                else if(objTipoDatoBase.getCompatibilidad() == 1){
                    return GeneradorComponentes.objComponentesPersonalizadosBase.get(this.component);
                }                 
            
            }
        else{            
            UtilRender.printlnConsole("Objeto Tipo Dato Represnetaciob base Nulo.", UtilRender.ACTION_NORMAL, false);            
        }
       }catch(java.lang.ArrayIndexOutOfBoundsException ex){            
            Logger.getLogger(ReferenciaPatronBase.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}